package com.thiswhyme.sentinel.server1.instance1.controller;

import com.alibaba.csp.sentinel.init.InitFunc;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;

import java.util.ArrayList;
import java.util.List;

/**
 * @description: 自定义规则
 * @author: thiswhyme
 * @date: 2020/10/26
 */
public class RuleInitFunc implements InitFunc {

    @Override
    public void init() throws Exception {
        initDegradeRule();
        initFlowRule();
    }

    /**
     * 初始化熔断规则
     */
    void initDegradeRule() {
        List<DegradeRule> rules = new ArrayList<>();
        DegradeRule rule = new DegradeRule();
        //资源名
        rule.setResource("user-name");
        //来源应用
        rule.setLimitApp(RuleConstant.LIMIT_APP_DEFAULT);
        //降级策略：0.RT，1.异常比例，2.异常数
        rule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO);
        //域值，含义跟随grade决定：0.
        //RT阈值（ms），1.异常率阈值，2.异常个数（个）
        rule.setCount(0.2);
        //降级发生时的降级恢复超时（熔断窗口，秒)
        rule.setTimeWindow(10);
        //可触发RT断路的最小连续慢速请求数，降级策略为0时使用，降级策略为0时使用
        rule.setRtSlowRequestAmount(2);
        //可触发断路的最小请求数（在活动统计时间跨度内）
        rule.setMinRequestAmount(10);
        rules.add(rule);

        DegradeRule rule2 = new DegradeRule("user-info");
        rule2.setCount(1000);
        rule2.setTimeWindow(5);
        rules.add(rule2);
        DegradeRuleManager.loadRules(rules);
    }

    /**
     * 初始化限流规则
     */
    void initFlowRule() {
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule();
        //资源名
        rule.setResource("user-name");
        //针对来源
        rule.setLimitApp(RuleConstant.LIMIT_APP_DEFAULT);
        //阈值类型：0.线程数，1.qps
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        //域值
        rule.setCount(1);
        //是否集群
        rule.setClusterMode(false);
        //流控模式：0.直接，1.关联，2.链路
        rule.setStrategy(RuleConstant.STRATEGY_DIRECT);
        //流控效果：0.快速失败，1.Warm Up, 2.排队等待 , 3.Warm Up&排队等待
        rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_WARM_UP_RATE_LIMITER);
        //预热时长（s）流控效果为1、3时使用
        rule.setWarmUpPeriodSec(10);
        //排队超时时间（ms）流控效果为2、3时使用
        rule.setMaxQueueingTimeMs(500);
        rules.add(rule);

        FlowRule rule2 = new FlowRule("user-info");
        rule2.setCount(1);
        rules.add(rule2);

        FlowRule rule3 = new FlowRule("/code-demo/user-info2");
        rule3.setCount(1);
        rules.add(rule3);
        FlowRuleManager.loadRules(rules);
    }
}
